<?php
/**
 * 使用openssl实现非对称加密
 */
class CRsa
{
	private $_privKey;

	private $_pubKey;

	private $_keyPath;
       
	public function __construct($path)
	{
		if(empty($path) || !is_dir($path)){
			throw new Exception('Must set the keys save path');
		}
		$this->_keyPath = $path;
	}

    /**
	* 生成密钥对，保存到存放路径
	*/
	public function createKey()
	{
		//OPENSSL_CONF = "D:/webservice/php5/extras/openssl/openssl.cnf"
		$configargs = array(
			"config" => "D:/webservice/php5/extras/openssl/openssl.cnf"
		);
		$r = openssl_pkey_new($configargs);
		var_dump($r);exit;
		openssl_pkey_export($r, $privKey);
		file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
		$this->_privKey = openssl_pkey_get_public($privKey);

		$rp = openssl_pkey_get_details($r);
		$pubKey = $rp['key'];
		file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key', $pubKey);
		$this->_pubKey = openssl_pkey_get_public($pubKey);
	}

    /**
	* 获取私钥
	*/
	public function setupPrivKey()
	{
		if(is_resource($this->_privKey)){
			return true;
		}
		$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
		$prk = file_get_contents($file);
		$this->_privKey = openssl_pkey_get_private($prk);
		return true;
	}
       
    /**
	* 获取公钥
	*/
	public function setupPubKey()
	{
		if(is_resource($this->_pubKey)){
			return true;
		}
		$file = $this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key';
		$puk = file_get_contents($file);
		$this->_pubKey = openssl_pkey_get_public($puk);
		return true;
	}
       
    /**
	* 私钥加密
	*/
	public function privEncrypt($data)
	{
		if(!is_string($data)){
			return null;
		}
		$this->setupPrivKey();
		$r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
		if($r){
			return base64_encode($encrypted);
		}
		return null;
	}
       
    /**
	* 私钥解密
	*/
	public function privDecrypt($encrypted)
	{
		if(!is_string($encrypted)){
			return null;
		}
               
		$this->setupPrivKey();
		
		$encrypted = base64_decode($encrypted);
		$r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
		if($r){
			return $decrypted;
		}
		return null;
	}
       
    /**
	* 公钥加密
	*/
	public function pubEncrypt($data)
	{
		if(!is_string($data)){
			return null;
		}
		$this->setupPubKey();
		$r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
		if($r){
			return base64_encode($encrypted);
		}
		return null;
	}
       
    /**
	* 公钥解密
	*/
	public function pubDecrypt($crypted)
	{
		if(!is_string($crypted)){
			return null;
		}
		$this->setupPubKey();
		$crypted = base64_decode($crypted);
		$r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
		if($r){
			return $decrypted;
		}
		return null;
	}
       
	public function __destruct()
	{
		@fclose($this->_privKey);
		@fclose($this->_pubKey);
	}

}